package com.bascker.algorithm.practice.dp;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * 一个专业的小偷，计划偷窃沿街的房屋，每间房内都藏有一定的现金。影响偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，
 * 如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。
 *
 * 给定一个代表每个房屋存放金额的非负整数数组，计算不触动警报装置的情况下，一夜之内能够偷窃到的 最高金额 。
 *
 * @author bascker
 * @apiNote from leetcode T198
 * @implNote https://gitee.com/bascker/algorithm/wikis/4%E3%80%81%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D?sort_id=3016156
 */
public class Rob {

    /**
     * 备忘录：使用 left"-"right 作为缓存 key
     */
    private final Map<String, Integer> map = new HashMap<>();

    public int rob(int[] nums) {
        if (Objects.isNull(nums) || nums.length == 0) {
            return 0;
        }

        return dfs(nums, 0, nums.length - 1);
    }

    public int dfs(int[] nums, int left, int right) {
        // 递归终止条件
        if (left > right) {
            return 0;
        }

        String key = left + "-" + right;
        if (map.containsKey(key)) {
            return map.get(key);
        }

        // 偷房间 i
        int x = nums[left] + dfs(nums, left + 2, right);

        // 不偷房间 i
        int y = dfs(nums, left + 1, right);

        // 最大值
        int rs = Math.max(x, y);
        map.put(key, rs);

        return rs;
    }

}
